package day0308;

import java.util.Arrays;

/**
 * 容器
 */
public class MyList {

    // 存储元素的容器
    Object[] data;

    // 容器中元素的数量
    int length;

    int increment;

    public MyList() {
        this(10, 5);
    }

    public MyList(int length) {
        this(length, 5);
    }

    public MyList(int length, int increment){
        data = new Object[length];
        this.increment = increment;
    }

    public void add(Object obj) {
        if (length == data.length) {
            data = Arrays.copyOf(data, data.length + increment);
        }
        this.data[length] = obj;
        length ++;
    }

    /**
     * 在指定下标添加指定元素
     * @param index
     * @param obj
     */
    public void add(int index, Object obj) {
        if (index < 0 || index > length) {
            throw new IllegalArgumentException("下标异常");
        }
        if (length == data.length) {
            data = Arrays.copyOf(data, data.length + increment);
        }
        // 把 index 之后的所有元素后移一位
        System.arraycopy(data, index, data, index + 1, length - index);

        // 将添加的元素放到 指定位置
        data[index] = obj;

        length ++;

    }

    /**
     * 获取第 length 个元素
     * @param no
     * @return
     */
    public Object get(int no) {
        if (no > length || no < 1) {
            throw new IllegalArgumentException("参数异常");
        }
        return this.data[no - 1];
    }

    /**
     * 根据下标(索引)删除指定元素
     * @param index 下标
     * @return 被删除的元素
     */
    public Object remove(int index){
        // 判断下标是否超出范围
        if (index > length || index < 0) {
            throw new IndexOutOfBoundsException("下标异常");
        }
        // 被删除的元素
        Object o = data[index];
        // 被删除元素之后的元素向前移动一位
        System.arraycopy(data, index + 1, data, index, length - index - 1);

        // 重复的元素置为 null
        data[length - 1] = null; // GC
        // 长度 - 1
        length --;
        // 返回被删除的元素
        return o;
    }

    /**
     * 删除第一次出现的指定元素
     * @param o 被删除的元素
     * @return 删除成功返回 true  不存在返回 false
     */
    public boolean remove(Object o) {
        int index = indexOf(o);

        if (index >= 0){
            System.arraycopy(data, index + 1, data, index, length - index - 1);

            data[length - 1] = null;

            length --;
            return true;
        }
        return false;
    }

    /**
     * 查询指定元素的下标
     * @param o
     * @return -1 表示不存在
     */
    public int indexOf(Object o){
        for (int i = 0; i < length; i++) {
            if (data[i].equals(o)) {
                return i;
            }
        }
        return -1;
    }



    public String toString() {
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < length; i++) {
            str.append(this.data[i] + ", ");
        }
        return str.substring(0, str.length() - 2);
    }
}
